package com.relytosoft.mizar.media.system.services.service;

import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.relytosoft.mizar.media.system.api.entity.SysDistrict;
import com.relytosoft.mizar.media.system.api.pojo.vo.DistrictSyncVo;
import com.relytosoft.mizar.media.system.api.pojo.dto.DistrictFeignDto;
import com.relytosoft.mizar.media.system.api.pojo.vo.SysDistrictVo;

import java.util.List;

/**
 * 区域
 *
 * @Author SunLi
 * @Date: 2022/4/7 14:19
 * @Version 1.0
 */
public interface SysDistrictService extends IService<SysDistrict> {

    /**
     * 更新区域状态
     * @param id 区域ID
     * @param status 状态 1启用 0禁用
     * @return
     */
    int updateSysDistrictStatus(int id,int status);

    /**
     * 查询区域列表
     * @param sysDistrict 查询条件
     * @return 符合条件的所有区域
     */
    List<SysDistrictVo> selectSysDistrictVoList(SysDistrict sysDistrict);

    /**
     * 查询所有启用的区域列表
     * @param name 区域名称
     * @return 启用的所有区域
     */
    List<SysDistrict> selectSysDistrictList(String name);

    /**
     * 将区域列表转化为区域树
     * @param districts 区域列表
     * @return 转化为区域树
     */
    List<Tree<Integer>> buildSysDistrictTreeSelect(List<SysDistrict> districts);

    /**
     * 验证区域编码是否唯一
     * @param sysDistrict 区域实体
     * @return 是否唯一
     */
    boolean checkCodeUnique(SysDistrict sysDistrict);

    /**
     * 验证区域名称在同父级下是否唯一
     * @param sysDistrict 区域实体
     * @return 是否唯一
     */
    boolean checkNameUnique(SysDistrict sysDistrict);

    /**
     * 判断区域能否操作禁用
     * 有已启用的子区域或有已启用的设备资源则不能禁用
     * @param id 区域ID
     * @return 是否
     */
    boolean canDisable(int id);

    /**
     * 查询指定第三方平台需要同步的区域列表
     * @param storeType 第三方平台HK HW
     * @return 待同步的区域列表
     */
    List<DistrictSyncVo> getDistrictSyncList(String storeType);

    /**
     * 查询指定区域信息
     * @param id 区域ID
     * @return 区域实体
     */
    SysDistrictVo getSysDistrictVo(int id);

    /**
     * 根据安全级别ID查询区域数量
     * @param securityLevelId 安全级别ID
     * @return
     */
    long countBySecurityLevel(int securityLevelId);

    /**
     * 查询所有区域列表（包含第三方平台区域关联ID）
     * @param storeType 存储平台
     * @return 带第三方区域ID的所有区域列表
     */
    List<DistrictFeignDto> selectDistrictFeignList(String storeType);
}
